//
//  CXMainController.swift
//  XinaWeibo
//
//  Created by chenxuan on 2017/4/4.
//  Copyright © 2017年 chenxuan. All rights reserved.
//

import UIKit

class CXMainController: UITabBarController {
    // MARK: - 私有控件
    /// 撰写按钮
    lazy var composeButton: UIButton = UIButton.cx_imageButton("tabbar_compose_icon_add",
                                                          backgroundImageName: "tabbar_compose_button")
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupChildControllers()
        
        setupComposeButton()
        
    }
    
    /**
     portrait    : 竖屏，肖像
     landscape   : 横屏，风景画
     
     - 使用代码控制设备的方向，好处，可以在在需要横屏的时候，单独处理！
     - 设置支持的方向之后，当前的控制器及子控制器都会遵守这个方向！
     - 如果播放视频，通常是通过 modal 展现的！
     */
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    /// 撰写微博
    @objc fileprivate func composeStatus() {
        print("撰写微博")
    }

}

// extension 类似于 OC 中的 分类，在 Swift 中还可以用来切分代码块
// 可以把相近功能的函数，放在一个 extension 中
// 便于代码维护
// 注意：和 OC 的分类一样，extension 中不能定义属性
// MARK: - 设置界面

extension CXMainController {
    
    /// 设置撰写按钮
    fileprivate func setupComposeButton() {
        
        tabBar.addSubview(composeButton)
        // 计算按钮的宽度
        let count = CGFloat((viewControllers?.count)!)
        // 将向内缩进的宽度
        let width = tabBar.bounds.width / count - 1;
        // CGRectInset 正数向内缩进，负数向外扩展
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * width, dy: 0)
        // 按钮监听方法
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
    }
    
    fileprivate func setupChildControllers() {
        // 0. 获取沙盒 json 路径
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (docDir as NSString).appendingPathComponent("main.json")

        // 加载 data
        var data = NSData(contentsOfFile: jsonPath)

        // 判断 data 是否有内容，如果没有，说明本地沙盒没有文件
        if data == nil {
            // data 一定会有一个内容，反序列化
            let path = Bundle.main.path(forResource: "main.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        
        // 反序列化转换成数组
        guard let array = try? JSONSerialization.jsonObject(with: data! as Data, options: []) as? [[String: AnyObject]]
            else {
                return
        }
        

        // 遍历数组，循环创建控制器数组
        var vcArray = [UIViewController]()
        for dict in array! {
            vcArray.append(controller(dict:dict))
        }
        // 设置 tabBar 的子控制器
        viewControllers = vcArray
        
    }
    
    /// 使用字典创建一个子控制器
    ///
    /// - parameter dict: 信息字典[clsName, title, imageName, visitorInfo]
    ///
    /// - return: 子控制器
    private func controller(dict:[String: AnyObject]) -> (UIViewController) {
        // 1. 取得字典内容
        guard let title = dict["title"] as? String,
        let imageName = dict["imageName"] as? String,
        let clsName = dict["clsName"] as? String,
        let cls =  NSClassFromString(Bundle.main.nameSpace1(name: clsName)) as? CXBaseViewController.Type,
        let visitorInfo = dict["visitorInfo"] as? [String : String] else {
            
            return UIViewController()
        }
        // 2. 创建视图控制器
        let vc = cls.init()
        vc.visitorInfoDictionary = visitorInfo
        vc.title = title
        // 3. 设置图像
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName)
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_selected")?.withRenderingMode(.alwaysOriginal)
        // 4. 设置 tabbar 的标题字体（大小）
        // 系统默认是 12 号字，修改字体大小，要设置 Normal 的字体大小
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.orange], for: .highlighted)
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName: UIFont.systemFont(ofSize: 13)], for: .normal)
        
        let nav = CXNavigationController(rootViewController:vc)
        return nav
        
        
    }
    
    
}
